const WebSocket = require('ws');

const SERVER_URL = 'wss://danmuproxy.douyu.com:8506/'; // Replace with the actual Douyu server URL
const ws = new WebSocket(SERVER_URL);

// 设置直播间号
const ROOM_ID = 24422; // Replace with the actual room ID

// 生成16位数据
function message(str) {
    str += '\0';
    const len = str.length;
    const buffer = new ArrayBuffer(len + 12);
    new DataView(buffer).setInt16(0, len + 8, true);
    new DataView(buffer).setInt16(4, len + 8, true);
    new DataView(buffer).setInt16(8, 45314, false);
    const bufView = new Uint8Array(buffer, 12);
    for (let i = 0; i < len; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buffer;
}


// 格式化消息, 非固定格式
function formatMessage2(message) {
    const fields = message.split("/");
    let typeValue = null;
    let nnValue = null;
    let txtValue = null;
    fields.forEach((field) => {
        if (field.startsWith("type@=")) {
            typeValue = field.split("@=")[1];
        } else if (field.startsWith("nn@=")) {
            nnValue = field.split("@=")[1];
        } else if (field.startsWith("txt@=")) {
            txtValue = field.split("@=")[1];
        }
    });
    console.log('消息类型:', typeValue);
    if (typeValue === 'chatmsg') {
        // 弹幕消息
        console.log('弹幕消息:', message);
        // 转成json格式
        const json = {
            type: typeValue,
            name: nnValue,
            text: txtValue
        }
        console.log('json:', json)
    }
}

// 监听WebSocket连接事件
ws.on('open', () => {
    console.log('WebSocket connected to Douyu server');

    const str = 'type@=loginreq/roomid@=' + ROOM_ID + '/dfl@=/username@=test/uid@=123456/ver@=20230722/aver@=218101901/ct@=0/';
    const buffer = message(str);
    ws.send(buffer);
    // 发送加入分组消息
    const str1 = "type@=joingroup/rid@=1/gid@=-9999/";
    const buffer1 = message(str1);
    ws.send(buffer1);
    // 订阅贵族消息
    const str2 = "type@=sub/mt@=online_vip_list/";
    const buffer2 = message(str2);
    ws.send(buffer2);

    // setTimeout(() => {
    // }, 1000);
    setInterval(() => {
        ws.send(message("type@=mrkl/"));
    }, 45000);
    // 订阅贵族消息
});

// // 监听WebSocket消息事件
// ws.on('message', (data) => {
//     // 收到消息
//     parseDouyuMessage(data);
// });
ws.onmessage = (data) => {
    parseDouyuMessage(data.data);
}

// 解析斗鱼消息
function parseDouyuMessage(data) {
    // console.log('Received server message:', data)
    // 由于数据是二进制数据，需要解析头部的消息长度字段来获取完整的消息数据
    const msgLength = data.readUInt32LE(0); // 从0号位置读取4字节的小端整数
    // console.log('Message Length:', msgLength)
    // 处理弹幕服务器发送给客户端的文本格式数据
    const dataPart = data.toString('utf8', 12, msgLength - 1); // 去掉头部长度字段和最后的'\0'
    // console.log('Received server message:', dataPart);
    formatMessage2(dataPart);
}
